package com.atguigu.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class Servlet02LifeCycle extends HttpServlet {

    // Servlet 容器：管理 Servlet 等组件的生命周期
    // 相比较数组、集合这样的简单容器，Servlet 容器可以说是一种复杂容器
    // Tomcat 是 Servlet 容器的一种，是一款具体的产品
    // Servlet 容器除了 Tomcat 还有很多别的产品：JBoss、WebLogic、WebSphere、Resin、GlassFish、TomEE、Jetty……
    // 不同容器之间是否可以兼容，答案是肯定的，因为 Tomcat 是 Servlet 容器，而 Servlet 容器是 Servlet 标准的一部分
    // 但是注意：不同 Servlet 之间遵循的 Servlet 标准的版本必须一致

    // 1、创建对象：Tomcat 调用无参构造器创建对象
    // 默认情况下：Tomcat 在接收到第一个指向当前 Servlet 的请求时，就会创建 Servlet 对象
    // 配置文件中配置了 load-on-startup 属性，Tomcat 启动或 Web 应用部署时，就会创建 Servlet 对象
    // 每次 Tomcat 运行，Servlet 只创建一个对象，构造器只执行一次
    public Servlet02LifeCycle() {
        System.out.println("Servlet02LifeCycle 创建对象了");
    }

    // 2、初始化：Tomcat 在创建 Servlet 对象之后会调用 init() 方法执行初始化操作
    // init() 方法只会执行一次
    @Override
    public void init() throws ServletException {
        System.out.println("Servlet02LifeCycle 执行初始化了");
    }

    // 3、每一次处理请求：Tomcat 调用 service() 方法处理请求
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Servlet02LifeCycle service() 方法处理请求了");
    }

    // 4、销毁：Tomcat 在 Web 应用关闭或卸载之前会调用 destroy() 方法执行清理
    // 只执行一次
    @Override
    public void destroy() {
        System.out.println("Servlet02LifeCycle 执行销毁了");
    }
}
